package cn.tedu.spring.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestUser {
    public static void main(String[] args) {
        /**
         * 方式1：new方式创建对象
         * User user1=new User();
         * user1.run();
         */
        /**
         * 方式2：反射方式创建对象
         * Class zz=Class.forName("cn.tedu.spring.example.User");
         * User user2=(User)zz.newInstance();
         * user2.run();
         */
        /**
         * 方式3：通过Spring框架创建对象
         * 1.由Spring框架创建出来的额对象，叫做 Spring Bean对象，简称 Bean对象
         * 2.Bean对象和普通的Java对象没有任何区别，只是为了区分创建者的身份
         * 3.IoC容器：创建和存放Spring Bean对象的容器
         *
         * ApplicationContext context=new AnnotationConfigApplicationContext("包扫描路径--cn.tedu.spring.example")；
         * 同个包中会有许多的类，需要或可以指定需要的类
         * User user3=context。getBean(User.class);
         * user3.run();
         *
         * Spring框架使用流程
         * 第一步：添加依赖，刷新maven
         * 第二步：在指定类上添加注解：@Component
         * 第三步：创建测试类
         *
         *
         * 依赖注入：DI，依赖注入实现了控制反转的思想，是指Spring创建对象的过程中，
         *          将对象依赖属性通过配置进行注入
         *
         * Bean对象的创建：
         *      方式一：xml文件配置Bean
         *          第一步：添加依赖Spring-context，刷新maven
         *          第二步：创建普通Java类
         *          第三步：告知Spring框架为类创建对象[创建 xxx.xm]结尾的文件
         *                  在包的同级目录的resources文件点击右键
         *                  选择new，出现选择
         *                  选择XML Configuration File ，出现选项
         *                  选择Spring Config 左键点击
         *                  生成窗口用来创建，先命名，回车后即可创建xxx.xml文件
         *                  之后为该文件出现提示条：Application context not configured for this file(翻译：未为此文件配置应用程序上下文)
         *                  选择：Configure application context，点击，出现选择
         *                  选择已有的Application Context（首次创建没有）或创建新的new Application Context，
         *                  点击ok即可
         *                  在创建的xml文件中添加id和class属性
         *                  例如： <bean id="userXml" class="cn.tedu.spring.example.UserXml" ></bean>
         *                        <!--
         *                        id属性：唯一标识，用于后期在IOC容器中获取Bean对象
         *                        class属性：类型
         *                        -->
         *                          通常以文件名的小写加上Xml，class写清位置就行
         *                  例如：<bean id="bookXml" class="cn.tedu.spring.dibase.Book">
         *                              <!-- 提前闭合的方法，前提没有完整的文本了
         *                              <property name="bookName" value="倚天屠龙记"/>
         *                              -->
         *                              <!-- property为属性赋值，依赖属性 内容不确定 -->
         *                              <property name="bookName" value="倚天屠龙记"/>
         *                              <property name="bookAuthor" value="周芷若"/>
         *                       </bean>
         *          第四步：创建测试类，基于xml的方式构建IOC容器
         *                  ApplicationContext context=new ClassPathXmlApplicationContext("创建的xml文件(配置文件路径)--bean.xml");
         *                                                                                  快捷键：
         *                                                                                      选中类的路径，单点击类
         *                                                                                      ctrl + shift + alt + c
         *
         *                                                                                      fn + ctrl + shift + alt + c
         *                  UserXml userXml=(UserXml) context.getBean("userXml");
         *                  UserXml userXml= context.getBean(UserXml.class);
         *                  UserXml userXml= context.getBean("userXml",UserXml.class);
         *                                              //可以根据id获取或者根据class类获取
         *                                              //bean的名称或者加上class
         *                  快捷键：context.getBean(...).var+回车+回车
         *                  userXml.run();
         *                      1.创建 IoC 容器;
         *                      2.获取 Bean 对象;
         *                      3.使用 Bean 对象;
         *                      ClassPathXmlApplicationContext: 基于xml文件方式构建IoC容器;
         *                      AnnotationConfigApplicationContext: 基于注解方式构建IoC容器;
         *                  框架创建的Bean对象详见同包类TestUserXml.java文件
         *      方式二：注解方式配置Bean
         *          详见cn.tedu.spring.bean包中信息
         *
         *
         */
        ApplicationContext context=new AnnotationConfigApplicationContext("cn.tedu.spring.example");
        User user3=context.getBean(User.class);
        user3.run();
    }
}
